
package DAO;

import Pojo.Cliente;
import Pojo.Item;
import Pojo.Pedido;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.HashMap;
import java.util.Map.Entry;

/**Classe que serve para manipulacao da Lista de Pedidos
 * 
 * @author Vitor
 */
public class PedidoDAO {
    private ArrayList<Pedido> listaPedidos = new ArrayList<Pedido>();
    private int ultimoCodigo;

    /**
     * Construtor da classe PedidoDAO
     */
    public PedidoDAO() {

    }
    
    /**Metodo para excluir um pedido da lista de pedidos
     * @param codigo - codigo do pedido a ser removido
     * @return boolean - true caso encontre e remova ou false caso contrario
     */
    public boolean excluirPedido(int codigo){
        Pedido pedidoAux = buscaPedidoCodigo(codigo);
        if(pedidoAux != null){
            listaPedidos.remove(pedidoAux);
            return true;
            
        }else{
            return false;
        }
        
    }
    
    /**Metodo que gera um codigo para o pedido
     * @return int - o codigo para pedido
     */
    public int proximoCodigo(){
        this.ultimoCodigo++;
        return this.ultimoCodigo;
    }
    
    /**Metodo que retorna o codigo do pedido
     * @return int - codigo do pedido
     */
    public int getUltimoCodigo() {
        return ultimoCodigo;
    }
    
    /**Metodo que atribui o pedido o novo codigo baseado no codigo do pedido anterior
     * @param ultimoCodigo - codigo do ultimo pedido 
     */
    public void setUltimoCodigo(int ultimoCodigo) {
        this.ultimoCodigo = ultimoCodigo;
    }
    
    /**Metodo que recebe um pedido e insere na lista de pedidos em aberto
     * @param pedido - pedido de um cliente
     */
    public void adicionarPedido(Pedido pedido){
        listaPedidos.add(pedido);
    }
   
    /**Metodo que retorna a lista com todos os pedidos
     * @return ArrayList - lista dos pedidos em aberto
     */
    public ArrayList<Pedido> getListaPedidos(){
       return listaPedidos;   
   }
      
   /**Metodo que recebe um codigo e busca na lista de pedidos um pedido com esse codigo
    * @param codigo - codigo do pedido
    * @return Pedido - pedido buscado
    */
   public Pedido buscaPedidoCodigo(int codigo){
        for(Pedido pedido: this.listaPedidos){
            if(pedido.getCodigo() == codigo){
                return pedido;
            }
        }
        return null;
    }
   
   /**Metodo que le de um arquivo, pedidos em aberto armazenados para serem fechados ou alterados
    * @param itemDao - Funçoes que ajudam na busca de um item especifico dentre outras coisas
    * @param clienteDao - Funçoes que ajudam na busca de um clinte especifico dentre outras coisas
    * @throws FileNotFoundException - caso o arquivo não seja encontrado
    */
    public void lerArquivo(ItemDAO itemDao, ClienteDAO clienteDao ) throws FileNotFoundException{

        Item item = null;
      //Le de um arquivo .txt os atributos de um fornecedor
        
        Scanner scanner = new Scanner(new FileReader("Pedido.txt"))
                       .useDelimiter("\\||\\n");
        
        this.ultimoCodigo = Integer.parseInt(scanner.nextLine());
        while (scanner.hasNext()) {
           
            Pedido novo = new Pedido();
            
            String s[] = scanner.nextLine().split(" ");
            for (int i = 0; i < s.length; i++) {
                if(i%2==0){
                    String s1 = s[i];
                    item = itemDao.buscaItemNome(s1);
                }else{
                    int quantidade = Integer.parseInt(s[i]);
                    novo.setItem(item, quantidade);
                    
                } 
            }
                        
            novo.setCodigo(Integer.parseInt(scanner.nextLine()));
            novo.setPreco(Float.parseFloat(scanner.nextLine()));
            Cliente aux = clienteDao.buscaCpf( scanner.nextLine() );
            novo.setCliente(aux);
            adicionarPedido(novo);
            
        }
    }
    
    /**Metodo que escreve em um arquivo as informações de todos os pedidos em aberto como
     * O codigo do pedido
     * o preco total do pedido
     * e o cpf do cliente
     */
    public void escreverArquivo(){
       //Transfere para um arquivo a lista de pedidos criadas pelo usuario
        try {
            FileWriter fw = new FileWriter("Pedido.txt",false);
            PrintWriter saida = new PrintWriter(fw,true);
            
            saida.println(this.ultimoCodigo);
            
            for(Pedido pedido : this.listaPedidos){
                HashMap<Item,Integer> hashItens = pedido.getHash();
                for ( Entry<Item, Integer> entry: hashItens.entrySet()) {
                      Item itemAux = entry.getKey();
                      saida.print(itemAux.getNome()+" ");
                      saida.print(entry.getValue()+" ");
                }
                saida.println();
                saida.println(pedido.getCodigo());
                saida.println(pedido.getPreco());
                saida.println(pedido.getCliente().getCpf());
            }    
           
            saida.close();
            fw.close();
        } catch (IOException e) {
        }
    }   
}